原始題目如下:(8kyu)
It's the academic year's end, fateful moment of your school report. The averages must be calculated. All the students come to you and entreat you to calculate their average for them. Easy ! You just need to write a script.
Return the average of the given array rounded down to its nearest integer.
The array will never be empty.
翻譯:
給一陣列,計算所有元素的平均值,(取最小整數)
function getAverage(marks){
return Math.floor(marks.reduce((acc,cur)=>acc+cur,0)/marks.length)
}
使用array的reduce
計算總和,計算平均後,使用Math.floor
取得最小整數。
reduce真的好好用,回不去了
const getAverage = marks => ~~(marks.reduce((s, v) => s + v) / marks.length);
~~
=Math.floor的效果,~~
比使用 Math.floor 的效能好,可以想成位元運算更接近底層的運作模式。
function getAverage(marks){
var sum = 0;
for(var i = 0;i<marks.length;i++){
sum+=marks[i];
}
return Math.floor(sum/marks.length);
}
這個寫法雖然code會比較長,但覺得是最好理解的,也是剛入門時學習的寫法之一!
摘自JavaScript Bitwise Operations
Opearator | Name | 說明 |
---|---|---|
& | AND | 對應位元都為1,回傳1 |
| | OR | 對應位元其中有一個以上為1,回傳1 |
^ | XOR | 對應位元只有一個為1,回傳1 |
~ | NOT | 反轉運算元的位元 (1->0, 0->1) |
運算式由運算子和運算元組成:
運算元
(operant)運算子
(operator)範例:
1+5
// 1和5為運算元
// +為運算子
而位元運算子則是將運算元視作一組32位元0/1的數值,也就是將數值轉成二進位制再進行運算。
範例:
十進位 二進位
9 1001
15 1111
9&15
// 一個一個位置對,都為1才回傳1
// 1001
9|15
// 有一方包含1就回傳1
// 1111
9^15
// 僅有一方為1,才回傳1
// 0110
其中比較有趣的是~
operator,它會將整數N
轉換成-(N+1)
~2 === -3 // true
~1 === -2 // true
~-1 === 0 // true
~~
最常用來取代Math.floor()
~~2 === Math.floor(2); // true, 2
~~2.5 === Math.floor(2); // true, 2
節錄文章總結:在追求更好的效能&簡化code的情況下,使用~~
是ok的,但千萬不要為了用而用,畢竟這樣~~
的寫法不是這麼容易理解。
以上為今日分享的內容,若有錯誤或是建議,請再隨時和我聯繫。